package various;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/*
 * Dette er en klasse som kun inneholder statiske metoder som hjelper til å håndtere XML dokumenter.
 */
public class XMLParser {
	
	private XMLParser(){
		
	}

	//en metode som leser en XML fil og returnerer den som en document-instans
	public static Document loadFile(File file) throws ParserConfigurationException, SAXException, IOException
	{
		DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
		Document doc = dBuilder.parse(file);
		doc.getDocumentElement().normalize();
		return doc;

	}
	
	//samme som loadFile(File), men den tar inn en string og gjør den om til en fil.
	public static Document loadFile(String filepath) throws ParserConfigurationException, SAXException, IOException
	{
		File file = new File(filepath);
		return loadFile(file);
	}
	
	//Henter ut ei Nodeliste basert på en XML tag, ut i fra et document man gir inn som paramter. 
	public static NodeList getNodesFrom(Document document, String tag)
	{
		return document.getElementsByTagName(tag);
	}

	//Samme som generateXMLfrom under, men denne tar inn en String til outputPath i stedet for en file.
	public static void generateXMLfrom(Document document, String outputPath) throws TransformerConfigurationException, TransformerFactoryConfigurationError, TransformerException 
	{
		File file = new File(outputPath);
		generateXMLfrom(document, file);
	}
	
	//denne metoden genererer et XML document ut i fra en document man sender inn. Output bestemmer hvor outputfila blir laget.
	public static void generateXMLfrom(Document document, File output) 
			throws TransformerFactoryConfigurationError, TransformerConfigurationException, TransformerException 
	{
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = null;
		transformer = transformerFactory.newTransformer();
		DOMSource source = new DOMSource(document);
		StreamResult result = new StreamResult(output);
		transformer.transform(source, result);
	}

}	
